package com.cmc.cloud.cmclink.doc.service.multimodaltransport;

import com.cmc.cloud.cmclink.doc.api.document.emums.ExImTypeEnum;
import com.cmc.cloud.cmclink.doc.api.document.emums.MulitOpOperationTypeEnum;
import com.cmc.cloud.cmclink.doc.entity.MultiOpDO;
import com.cmc.cloud.cmclink.doc.vo.multimodaltransport.multiop.*;
import com.cmes.framework.common.pojo.PageResult;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 多式联运代理设置信息，发送邮件记录 Service 接口
 *
 * @author 集运管理员
 */
public interface MultiOpService {

    /**
     * 创建多式联运代理设置信息，发送邮件记录
     *
     * @param createReqVO 创建信息
     */
    void createMultiOp(@Valid MultiOpCreateReqVO createReqVO);

    /**
     * 更新多式联运代理设置信息，发送邮件记录
     *
     * @param updateReqVO 更新信息
     */
    void updateMultiOp(@Valid MultiOpUpdateReqVO updateReqVO);

    /**
     * 删除多式联运代理设置信息，发送邮件记录
     *
     * @param id 编号
     */
    void deleteMultiOp(Long id);

    /**
     * 获得多式联运代理设置信息，发送邮件记录
     *
     * @param id 编号
     * @return 多式联运代理设置信息，发送邮件记录
     */
    MultiOpDO getMultiOp(Long id);

    /**
     * 获得多式联运代理设置信息，发送邮件记录列表
     *
     * @param ids 编号
     * @return 多式联运代理设置信息，发送邮件记录列表
     */
    List<MultiOpDO> getMultiOpList(Collection<Long> ids);

    /**
     * 获得多式联运代理设置信息，发送邮件记录分页
     *
     * @param pageReqVO 分页查询
     * @return 多式联运代理设置信息，发送邮件记录分页
     */
    PageResult<MultiOpDO> getMultiOpPage(MultiOpPageReqVO pageReqVO);

    /**
     * @param pageVo
     * @return
     */
    PageResult<MultiOpCustomBrokerRespVO> pageCustomBroker(@Valid MultiOpCustomBrokerPageReqVO pageVo, ExImTypeEnum exImTypeEnum);

    /**
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    void setOp(List<Long> blnoIds, String content, String remark, String emailAddress, MulitOpOperationTypeEnum opOperationTypeEnum, ExImTypeEnum exImTypeEnum);

    /**
     * @return
     */
    List<MultiOpCheckMsgReqVO> checkOp(List<Long> blnoIds, String content, MulitOpOperationTypeEnum opOperationTypeEnum, ExImTypeEnum exImTypeEnum);

    /**
     * @param pageVo
     * @return
     */
    PageResult<MultiOpBargeAgentBrokerRespVO> imPageBargeAgentBroker(@Valid MultiOpBargeAgentBrokerPageReqVO pageVo);

    /**
     * @param req
     * @return
     */
    List<MultiOpSumRespVO> querySumByTime(MultiOpSumReqVO req);
}
